/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deployment.dao;

import br.com.deployment.daogenerico.DaoGenerico;
import br.com.deployment.entidade.registroimovel.Imovel;
import br.com.deployment.entidade.humana.Pessoa;
import br.com.deployment.entidade.registroimovel.GeoRef;
import br.com.deployment.servico.CartorioServico;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.LocalBean;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 *
 * @author elyjr
 */
@Stateless
@LocalBean
public class ImovelDaoImpl extends DaoGenerico<Imovel> {

    @EJB
    private CartorioServico cartorioServico;
     
    public ImovelDaoImpl() {
        super(Imovel.class);
    }

    

    /**
     * Retorna todos os imoveis, em decrescente
     * @return 
     */
    
    @Override
    public List<Imovel> findAll() {
        Query q = getEm().createQuery("Select i from Imovel i JOIN i.cartorio c "
                + "  where c.id = :cartorio ORDER BY i.id DESC");
        q.setParameter("cartorio", cartorioServico.getCartorioContext().getId());
        return q.getResultList();
    }

    /**
     * Traz um limite de imoveis
     * @param limit
     * @param registro
     * @return 
     */
    
    public List<Imovel> findImovelLimit(int limit, String registro) {
        List<Imovel> imovel = new ArrayList<Imovel>();
        Query q = getEm().createQuery("Select i from Imovel i where lower(i.registro) like lower(:registro)");

        if (registro != "" || registro != null) {
            q.setParameter("registro", "%" + registro + "%");
        }
        imovel = q.getResultList();
        System.out.println(imovel);
        return imovel;
    }

    /**
     * Busca os imoveis pode buscar por algum atributo de imovel, ou pelo adquirente/transmitente
     * @param imovel
     * @param pessoaAdquirente
     * @param pessoaTransmitente
     * @return 
     */
    
    public List<Imovel> findImovel(Imovel imovel, Pessoa pessoaAdquirente, Pessoa pessoaTransmitente) {
        List<Imovel> lista = new ArrayList<Imovel>();
        System.out.println("resultado p >>(" + imovel.getRegistro() + ")");

        String sql = "select i from Imovel i";
        if (pessoaAdquirente != null) {
            sql += ", Transferencia t JOIN t.adquirente a "
                    + " where i = t.imovel and ";
        } else if (pessoaTransmitente != null) {
            sql += ", Transferencia t JOIN t.transmitente tra "
                    + " where i = t.imovel and ";
        } else {
            sql += " where ";
        }
        if (imovel.getRegistro() == null || !"".equals(imovel.getRegistro())) {
            sql += " lower(i.registro) like lower(:registro) and";
        }
        if (pessoaAdquirente != null) {
            sql += " t.id = (Select max(tr.id) from Transferencia tr where tr.imovel = t.imovel) and ";
            if (pessoaAdquirente.getNome() != null && pessoaAdquirente.getNome() != "") {
                sql += " lower(a.nome) like lower(:nome) and ";
            }
            if (pessoaAdquirente.getCpf() != null && pessoaAdquirente.getCpf() != "") {
                sql += " lower(a.cpf) like lower(:cpf) and ";
            }
            if (pessoaAdquirente.getRg() != null && pessoaAdquirente.getRg() != "") {
                sql += " lower(a.rg) like lower(:rg) and ";
            }
            if (pessoaAdquirente.getCnpj() != null && pessoaAdquirente.getCnpj() != "") {
                sql += " lower(a.cnpj) like lower(:cnpj) and ";
            }
        }

        //transmitente

        if (pessoaTransmitente != null) {
            sql += " t.id = (Select max(tr.id) from Transferencia tr where tr.imovel = t.imovel) and ";

            if (pessoaTransmitente.getNome() != null && pessoaTransmitente.getNome() != "") {
                sql += " lower(tra.nome) like lower(:nome) and ";
            }
            if (pessoaTransmitente.getCpf() != null && pessoaTransmitente.getCpf() != "") {
                sql += " lower(tra.cpf) like lower(:cpf) and ";
            }
            if (pessoaTransmitente.getRg() != null && pessoaTransmitente.getRg() != "") {
                sql += " lower(tra.rg) like lower(:rg) and ";
            }
            if (pessoaTransmitente.getCnpj() != null && pessoaTransmitente.getCnpj() != "") {
                sql += " lower(tra.cnpj) like lower(:cnpj) and ";
            }
        }


        sql += " 1=1 ";

        Query query = getEm().createQuery(sql);
        //aqdquirente
        if (pessoaAdquirente != null) {
            if (pessoaAdquirente.getNome() != null && pessoaAdquirente.getNome() != "") {
                query.setParameter("nome", "%" + pessoaAdquirente.getNome() + "%");
            }
            if (pessoaAdquirente.getCpf() != null && pessoaAdquirente.getCpf() != "") {
                query.setParameter("cpf", "%" + pessoaAdquirente.getCpf() + "%");
            }
            if (pessoaAdquirente.getRg() != null && pessoaAdquirente.getRg() != "") {
                query.setParameter("rg", "%" + pessoaAdquirente.getRg() + "%");
            }
            if (pessoaAdquirente.getCnpj() != null && pessoaAdquirente.getCnpj() != "") {
                query.setParameter("cpnj", "%" + pessoaAdquirente.getCnpj() + "%");
            }
        }
        //transmitente
        if (pessoaTransmitente != null) {
            if (pessoaTransmitente.getNome() != null && pessoaTransmitente.getNome() != "") {
                query.setParameter("nome", "%" + pessoaTransmitente.getNome() + "%");
            }
            if (pessoaTransmitente.getCpf() != null && pessoaTransmitente.getCpf() != "") {
                query.setParameter("cpf", "%" + pessoaTransmitente.getCpf() + "%");
            }
            if (pessoaTransmitente.getRg() != null && pessoaTransmitente.getRg() != "") {
                query.setParameter("rg", "%" + pessoaTransmitente.getRg() + "%");
            }
            if (pessoaTransmitente.getCnpj() != null && pessoaTransmitente.getCnpj() != "") {
                query.setParameter("cpnj", "%" + pessoaTransmitente.getCnpj() + "%");
            }
        }


        //registro
        if (imovel.getRegistro() == null || !"".equals(imovel.getRegistro())) {
            query.setParameter("registro", "%" + imovel.getRegistro() + "%");
        }

        lista = query.getResultList();
        System.out.println("resultado >>" + sql);

        return lista;
    }

    /**
     * Busca o Imóvel para transferência
     * @param imovel
     * @return 
     */
    
    public Imovel findTransf(Imovel imovel) {
        String sql = "select i from Imovel i where i.registro = :registro and i.dataCadastro = :data order by i.id DESC";

        Query query = getEm().createQuery(sql);
        if (imovel.getRegistro() != null) {
            query.setParameter("registro", "" + imovel.getRegistro());
        }
        if (imovel.getDataCadastro() != null) {
            query.setParameter("data", imovel.getDataCadastro());
        }
        
        return (Imovel) query.getResultList().get(0);
    }
    
     public List<GeoRef> geoRefAll(){
         String sql = "select gf from GeoRef gf";

        Query query = getEm().createQuery(sql);
        
        return (List<GeoRef>) query.getSingleResult();
    }
}
